byte radky[4] = {3,8,7,5};
byte sloupce[3] = {4,2,6};

char znaky[4][3] = {{'1','2','3'},
                    {'4','5','6'},
                    {'7','8','9'},
                    {'*','0','#'}};

int cekej = 200;
long cas;
byte pozice = 0; //pomocna promenna udavajici aktualni znak
byte chyby; //promenna pro ukladani neshod kodu
char spravnyKod[100] = "12321";
char kod[100];

void setup(){
    for(int i = 0; i < 4; i++){
        pinMode(radky[i], OUTPUT);
    }  
    for(int i = 0; i < 3; i++){
        pinMode(sloupce[i], INPUT);
    }
    
    cas = millis();
}

void loop(){
    for(int a = 0; a < 4; a++){
        digitalWrite(radky[a],HIGH);
        for(int b = 0; b < 3; b++){
            if(digitalRead(sloupce[b]) == HIGH 
			&& millis() - cekej > cas){
                tone(10,440,100);
                cas = millis();
                
                if(znaky[a][b] == '#'){ 
				//pokud najde krizek, vymaze kod
                    vynuluj();
                }
                else if(znaky[a][b] == '*'){ 
				//kdyz najde hvezdicku, zkontroluje shodu
                    for(int c = 0; c < 100; c++){
                        if(kod[c] != spravnyKod[c]){
                            chyby++;
                        }
                    }
                    if(chyby > 0){
                        vynuluj();
                        for(int d = 0; d < 10; d++){ //sirena
                            for(int c = 200; c < 2000; c++){
                                tone(10, c, 5);
                            }
                            for(int c = 2000; c > 200; c--){
                                tone(10, c, 5);
                            }
                        }
                    }
 					else{
                        vynuluj();
                        tone(10, 1000, 100); //trikrat pipne
                        delay(200);
                        tone(10, 1000, 100);
                        delay(200);
                        tone(10, 1000, 100);
                    } 
                }
                else{
                    kod[pozice] = znaky[a][b];
                    pozice++;
                }
            }
        }
        digitalWrite(radky[a],LOW);
    }        
}

void vynuluj(){ //funkce pro vymazani retezce kod
    for(int c = 0; c < 100; c++){
        kod[c] = 0;
    }
    pozice = 0; 
    chyby = 0;   
}